package it.fc.service.db.manager;

import it.fc.bean.GiocatoriBean;
import it.fc.exceptions.FcException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;

public class DbCalciatoriManager extends DbManager {

    /**
     * Find giocatore by id
     * 
     * @return giocatore
     */

    private static Logger log = Logger.getLogger(DbCalciatoriManager.class);

    public void deletePlayer(int idgiocatore) throws FcException {

        Connection conn = null;

        try {
            StringBuffer query = new StringBuffer();
            query.append("DELETE FROM GIOCATORE ");
            query.append("WHERE IDGIOCATORE =");
            query.append(idgiocatore);

            log.info("delete giocatore DB " + idgiocatore);

            conn = getConnection();
            Statement stm = conn.createStatement();
            stm.execute(query.toString());
            log.debug("Cancellazione giocatore " + idgiocatore + " avvenuto con successo!");

        } catch (SQLException e) {
            log.error("Errore in deleteGIocatore >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in deleteUser(closeConn) >> " + e.getMessage());
            }
        }

    }

    public List<GiocatoriBean> getGiocatoriList() throws FcException {

        List<GiocatoriBean> listGiocatori = new ArrayList<GiocatoriBean>();
        String query = "SELECT * FROM GIOCATORE";

        Connection conn = null;

        try {
            conn = getConnection();
            Statement stm = conn.createStatement();
            ResultSet res = stm.executeQuery(query);

            while (res.next()) {
                GiocatoriBean giocatore = new GiocatoriBean();
                giocatore.setNome(res.getString("nome"));
                giocatore.setPresenze(res.getInt("Presenze"));
                giocatore.setGolSubiti(res.getInt("GolSubiti"));
                giocatore.setGolFatti(res.getInt("GolFatti"));
                giocatore.setMediaVoto(res.getInt("MediaVoto"));
                giocatore.setValore(res.getInt("Valore"));
                giocatore.setSquadra(res.getString("squadra"));
                giocatore.setRuolo(res.getString("Ruolo"));
                giocatore.setEspulsioni(res.getInt("Espulsioni"));
                giocatore.setAmmonizioni(res.getInt("Ammonizioni"));
                giocatore.setIdgiocatore(res.getInt("idgiocatore"));

                listGiocatori.add(giocatore);
            }

        } catch (SQLException e) {
            log.error("Errore in getGiocatoriList >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in getGiocatoriList(closeConn) >> " + e.getMessage());
            }
        }
        return listGiocatori;
    }

    public List<GiocatoriBean> getGiocatoriRemaining(List<GiocatoriBean> myTeam, String role) throws FcException {

        List<GiocatoriBean> listGiocatori = new ArrayList<GiocatoriBean>();

        Connection conn = null;

        try {
            conn = getConnection();

            StringBuffer strBuf = new StringBuffer();
            strBuf.append("SELECT * FROM GIOCATORE ");
            strBuf.append("WHERE RUOLO ='");
            strBuf.append(role);
            strBuf.append("' ");
            strBuf.append("AND IDGIOCATORE NOT IN (");
            int i;

            for (i = 0; i < myTeam.size(); i++) {
                strBuf.append(myTeam.get(i).getIdgiocatore());
                if (i < myTeam.size() - 1) {
                    strBuf.append(",");
                } else {
                    strBuf.append(");");
                }
            }

            Statement stm = conn.createStatement();
            log.debug("Execute query : " + strBuf);
            ResultSet res = stm.executeQuery(strBuf.toString());

            while (res.next()) {
                GiocatoriBean giocatore = new GiocatoriBean();
                giocatore.setNome(res.getString("nome"));
                giocatore.setPresenze(res.getInt("Presenze"));
                giocatore.setGolSubiti(res.getInt("GolSubiti"));
                giocatore.setGolFatti(res.getInt("GolFatti"));
                giocatore.setMediaVoto(res.getInt("MediaVoto"));
                giocatore.setValore(res.getInt("Valore"));
                giocatore.setSquadra(res.getString("squadra"));
                giocatore.setRuolo(res.getString("Ruolo"));
                giocatore.setEspulsioni(res.getInt("Espulsioni"));
                giocatore.setAmmonizioni(res.getInt("Ammonizioni"));
                giocatore.setIdgiocatore(res.getInt("idgiocatore"));

                listGiocatori.add(giocatore);
            }

        } catch (SQLException e) {
            log.error("Errore in getGiocatoriList >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in getGiocatoriList(closeConn) >> " + e.getMessage());
            }
        }
        return listGiocatori;
    }

    /**
     * Find giocatore by id
     * 
     * @return giocatore
     */

    public GiocatoriBean findCalciatore(int idCalciatore) throws FcException {
        GiocatoriBean giocatore = null;
        Connection conn = null;

        try {
            conn = getConnection();

            StringBuffer strBuf = new StringBuffer();
            strBuf.append("SELECT * FROM GIOCATORE ");
            strBuf.append("WHERE IDGIOCATORE = ");
            strBuf.append(idCalciatore);

            Statement stm = conn.createStatement();
            log.debug("Execute query : " + strBuf);
            ResultSet res = stm.executeQuery(strBuf.toString());

            while (res.next()) {
                giocatore = new GiocatoriBean();
                giocatore.setNome(res.getString("nome"));
                giocatore.setPresenze(res.getInt("Presenze"));
                giocatore.setGolSubiti(res.getInt("GolSubiti"));
                giocatore.setGolFatti(res.getInt("GolFatti"));
                giocatore.setMediaVoto(res.getInt("MediaVoto"));
                giocatore.setValore(res.getInt("Valore"));
                giocatore.setSquadra(res.getString("squadra"));
                giocatore.setRuolo(res.getString("Ruolo"));
                giocatore.setEspulsioni(res.getInt("Espulsioni"));
                giocatore.setAmmonizioni(res.getInt("Ammonizioni"));
                giocatore.setIdgiocatore(res.getInt("idgiocatore"));
            }

        } catch (SQLException e) {
            log.error("Errore in findCalciatore >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in findCalciatore(closeConn) >> " + e.getMessage());
            }
        }
        return giocatore;
    }

    public int insertCalciatori(int idSquadra, List<Integer> calciatori) throws FcException {

        int budget = 0;
        String query = "INSERT INTO SQUADRA_CALCIATORI(IDSQUADRA,IDCALCIATORE) VALUES (?,?)";

        Connection conn = null;

        try {
            conn = getConnection();
            PreparedStatement prepStm = conn.prepareStatement(query);

            Iterator<Integer> it = calciatori.iterator();
            while (it.hasNext()) {
                int idCurrent = it.next();
                int costo = ((GiocatoriBean) findCalciatore(idCurrent)).getIdgiocatore();
                budget = costo + budget;
                prepStm.setInt(1, idSquadra);
                prepStm.setInt(2, idCurrent);
                prepStm.execute();
            }

            log.debug("Inserimento giocatori per la squadra : " + idSquadra + " effettuato!");
        } catch (SQLException e) {
            log.error("Errore in insertCalciatori >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in insertCalciatori(closeConn) >> " + e.getMessage());
            }
        }

        return budget;
    }

    public void deleteCalciatori(int idSquadra) throws FcException {

        String query = "DELETE FROM SQUADRA_CALCIATORI WHERE IDSQUADRA = ?";

        Connection conn = null;

        try {
            conn = getConnection();
            PreparedStatement prepStm = conn.prepareStatement(query);
            prepStm.setInt(1, idSquadra);
            int row = prepStm.executeUpdate();

            log.debug("DELETE : " + idSquadra + " effettuato! (" + row + ") calciatori deleted..");
        } catch (SQLException e) {
            log.error("Errore in deleteCalciatori >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in deleteCalciatori(closeConn) >> " + e.getMessage());
            }
        }
    }

    public List<GiocatoriBean> getGiocatoriList(String role) throws FcException {

        List<GiocatoriBean> listGiocatori = new ArrayList<GiocatoriBean>();
        String query = "SELECT * FROM GIOCATORE WHERE RUOLO ='" + role + "'";

        Connection conn = null;

        try {
            conn = getConnection();
            Statement stm = conn.createStatement();
            log.debug("Executing : " + query);
            ResultSet res = stm.executeQuery(query);

            while (res.next()) {
                GiocatoriBean giocatore = new GiocatoriBean();
                giocatore.setNome(res.getString("nome"));
                giocatore.setPresenze(res.getInt("Presenze"));
                giocatore.setGolSubiti(res.getInt("GolSubiti"));
                giocatore.setGolFatti(res.getInt("GolFatti"));
                giocatore.setMediaVoto(res.getInt("MediaVoto"));
                giocatore.setValore(res.getInt("Valore"));
                giocatore.setSquadra(res.getString("squadra"));
                giocatore.setRuolo(res.getString("Ruolo"));
                giocatore.setEspulsioni(res.getInt("Espulsioni"));
                giocatore.setAmmonizioni(res.getInt("Ammonizioni"));
                giocatore.setIdgiocatore(res.getInt("idgiocatore"));

                listGiocatori.add(giocatore);
            }

        } catch (SQLException e) {
            log.error("Errore in getGiocatoriList >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in getGiocatoriList(closeConn) >> " + e.getMessage());
            }
        }
        return listGiocatori;
    }

    public void insertPlayer(GiocatoriBean g) throws FcException {

        Connection conn = null;
        Statement st = null;

        StringBuffer query1 = new StringBuffer();
        log.debug("Inizio Inserimento !!!!");
        query1.append("Insert into giocatore (nome,Presenze,GolFatti,");
        query1.append("GolSubiti,MediaVoto,valore,");
        query1.append("squadra,Ruolo,Espulsioni,Ammonizioni) values('");
        query1.append(g.getNome());
        query1.append("','");
        query1.append(g.getPresenze());
        query1.append("','");
        query1.append(g.getGolFatti());
        query1.append("','");
        query1.append(g.getGolSubiti());
        query1.append("','");
        query1.append(g.getMediaVoto());
        query1.append("','");
        query1.append(g.getValore());
        query1.append("','");
        query1.append(g.getSquadra());
        query1.append("','");
        query1.append(g.getRuolo());
        query1.append("','");
        query1.append(g.getEspulsioni());
        query1.append("','");
        query1.append(g.getAmmonizioni());
        query1.append("')");
        try {
            conn = getConnection();
            st = conn.createStatement();
            st.execute(query1.toString());
            log.debug("Inserimento riuscito !!!!");
        } catch (Exception ex1) {
            ex1.printStackTrace();
        }
    }
}
